package controllers

import (
	"net/http"
	"strconv"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/go-starter/models"
)

// UserController 用户控制器
type UserController struct {
	// 这里可以添加依赖，如数据库连接等
}

// NewUserController 创建用户控制器实例
func NewUserController() *UserController {
	return &UserController{}
}

// GetUsers godoc
// @Summary      获取用户列表
// @Description  获取所有用户的列表
// @Tags         users
// @Accept       json
// @Produce      json
// @Success      200  {array}   models.UserResponse
// @Router       /api/users [get]
func (uc *UserController) GetUsers(c *gin.Context) {
	// 模拟从数据库获取用户列表
	users := []models.User{
		{
			ID:        1,
			Username:  "user1",
			Email:     "user1@example.com",
			Password:  "password",
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		},
		{
			ID:        2,
			Username:  "user2",
			Email:     "user2@example.com",
			Password:  "password",
			CreatedAt: time.Now(),
			UpdatedAt: time.Now(),
		},
	}

	// 转换为响应模型
	responses := make([]models.UserResponse, len(users))
	for i, user := range users {
		responses[i] = user.ToResponse()
	}

	c.JSON(http.StatusOK, responses)
}

// GetUser godoc
// @Summary      获取单个用户
// @Description  根据ID获取用户信息
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        id   path      int  true  "用户ID"
// @Success      200  {object}  models.UserResponse
// @Failure      404  {object}  map[string]string
// @Router       /api/users/{id} [get]
func (uc *UserController) GetUser(c *gin.Context) {
	// 获取URL参数中的用户ID
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	// 模拟从数据库获取用户
	user := models.User{
		ID:        uint(id),
		Username:  "user" + idStr,
		Email:     "user" + idStr + "@example.com",
		Password:  "password",
		CreatedAt: time.Now(),
		UpdatedAt: time.Now(),
	}

	c.JSON(http.StatusOK, user.ToResponse())
}

// CreateUser godoc
// @Summary      创建用户
// @Description  创建新用户
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        user  body      models.User  true  "用户信息"
// @Success      201   {object}  models.UserResponse
// @Failure      400   {object}  map[string]string
// @Router       /api/users [post]
func (uc *UserController) CreateUser(c *gin.Context) {
	var user models.User

	// 绑定JSON请求体到用户模型
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 设置创建时间和更新时间
	now := time.Now()
	user.CreatedAt = now
	user.UpdatedAt = now

	// 模拟保存到数据库并生成ID
	user.ID = 100

	c.JSON(http.StatusCreated, user.ToResponse())
}

// UpdateUser godoc
// @Summary      更新用户
// @Description  根据ID更新用户信息
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        id    path      int          true  "用户ID"
// @Param        user  body      models.User  true  "用户信息"
// @Success      200   {object}  models.UserResponse
// @Failure      400   {object}  map[string]string
// @Failure      404   {object}  map[string]string
// @Router       /api/users/{id} [put]
func (uc *UserController) UpdateUser(c *gin.Context) {
	// 获取URL参数中的用户ID
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	var user models.User

	// 绑定JSON请求体到用户模型
	if err := c.ShouldBindJSON(&user); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
		return
	}

	// 设置ID和更新时间
	user.ID = uint(id)
	user.UpdatedAt = time.Now()

	c.JSON(http.StatusOK, user.ToResponse())
}

// DeleteUser godoc
// @Summary      删除用户
// @Description  根据ID删除用户
// @Tags         users
// @Accept       json
// @Produce      json
// @Param        id   path      int  true  "用户ID"
// @Success      204  {object}  nil
// @Failure      400  {object}  map[string]string
// @Router       /api/users/{id} [delete]
func (uc *UserController) DeleteUser(c *gin.Context) {
	// 获取URL参数中的用户ID
	idStr := c.Param("id")
	_, err := strconv.Atoi(idStr)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": "无效的用户ID"})
		return
	}

	// 模拟从数据库删除用户

	c.Status(http.StatusNoContent)
}